from typing import Any, Dict, List

from .base_node import BaseNode


class TaskAssignmentNode(BaseNode):
    """
    任务指派节点（单一职责：根据配置生成任务并记录到上下文）。
    
    职责说明：
    - 读取 data.assignTo/priority/enableNotification 等配置
    - 在上下文中追加任务记录，供外部系统或后续节点消费
    - 通过默认出边进入下一节点
    """
    def execute(self, graph: 'FlowGraph', context: Dict[str, Any], log: callable) -> List[str]:
        """
        执行任务指派并返回默认后继节点。
        
        Args:
            graph ('FlowGraph'): 流程图对象
            context (Dict[str, Any]): 当前执行上下文
            log (callable): 日志记录函数
        
        Returns:
            List[str]: 下一步要执行的节点 ID 列表（默认出边）
        """
        data = self.data
        assign_to = data.get('assignTo', {})
        target_type = assign_to.get('type')
        target = assign_to.get('target') or assign_to.get('targetName') or ''
        priority = data.get('priority', 'medium')
        notif = data.get('enableNotification', True)
        log(f"[TASK] Node {self.id} assign to {target_type}:{target} priority={priority} notify={notif}")
        context.setdefault('tasks', []).append({
            'nodeId': self.id,
            'assignTo': assign_to,
            'priority': priority,
            'notified': bool(notif),
        })
        return [e.target for e in graph.get_outgoing_edges(self.id) if e.source_handle in (None, 'default')]